/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Cliente;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IClienteDAO;
import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Los objetos de esta clase se encargan de la entrada, salida, modificacion y
* borrado de en la tabla de Clientes.
* @author David
**/
public class SQLServerClienteDAO implements IClienteDAO {

    
    private static ResourceBundle rb;

      /**
    * Constructor de la clase.
    **/
    public SQLServerClienteDAO(){
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }
    /**
    * Método que inserta un Ciente en la base de datos.
    * @param con Cliente que es un objeto de tipo cliente con los datos de la misma
     * @return boolean  Devuelve un true en caso de que la sentencis haya ejecutado bien o false en caso de que mal
    **/
    public boolean nuevoCliente(Cliente cli) {
        return ejecutarSentencia("INSERT INTO [Practicas].[dbo].[cliente] (CliId,CliNom,CliTlf1,"
                                +"CliTlf2,CliMail,CliWeb,CliDir,CliObserv) values("+
                                 cli.getCliId()       +",'"+
                                 cli.getCliNom()      +"','"+
                                 cli.getCliTlf1()      +"','"+
                                 cli.getCliTlf2()     +"','"+
                                 cli.getCliMail()     +"','"+
                                 cli.getCliWeb()     +"','"+
                                 cli.getCliDir()      +"','"+
                                 cli.getCliObserv()+"','"+ "')");
    }
    /**
    * Método que elimina una Contacto de la base de datos.
    * @param sConvId String que contiene el id del Contacto a eliminar.
      * @return boolean Devuelve un true en caso de que la sentencis haya ejecutado bien o false en caso de que mal
    **/
    public boolean borrarCliente(String sCliId) {
       return ejecutarSentencia ("DELETE FROM [Practicas].[dbo].[cliente] WHERE CliId=" + sCliId);
    }
    /**
    * Método que modifica un Contacto de la base de datos.
    * @param con Contacto que es un objeto de tipo Contacto con los datos del mismo
      *  @return boolean
      * Devuelve un true en caso de que la sentencis haya ejecutado bien o false en caso de que mal
    **/
    public boolean modificarCliente(Cliente cli) {
        return ejecutarSentencia("UPDATE [Practicas].[dbo].[cliente] SET CliNom='" + cli.getCliNom() +
                "',CliTlf1='" + cli.getCliTlf1()+ "',CliTlf2='" + cli.getCliTlf2() +
                "',CliMail='" + cli.getCliMail()+ "',CliWeb='" + cli.getCliWeb() +
                "',CliDir='" + cli.getCliDir() + "',ClirObserv='" + cli.getCliObserv() +
                " WHERE CliId=" + cli.getCliId());
    }
    /**
    * Método que muestra los Contactos que hay dentro de un filtro.
    * @param filtro String que contiene el filtro que se le va a añadir a la select.
     * @return alContactos ArrayList que es un arraylist que contiene Contactos.
    **/
    public ArrayList getCliente(String filtro) throws GestorFormacionExcepcion {
        ArrayList<Cliente> alClientes = new ArrayList<Cliente>();
        Connection con=null;
        Statement stmt=null;
        ResultSet rs = null;
       
        String sentencia= "SELECT * FROM [dbo].[cliente]" + filtro;

        try {
            con = SQLServerDAOFactory.conecta();
            stmt = con.createStatement();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            rs = stmt.executeQuery(sentencia);
            while (rs.next()){
                Cliente auxCont=new Cliente (rs.getInt("CliId"), rs.getString("CliNom"),
                                                rs.getString("CliTlf1"),rs.getString("CliTlf2"),
                                                rs.getString("CliMail"),rs.getString("CliWeb"),
                                                rs.getString("CliDir"),rs.getString("CliObserv"));
                alClientes.add(auxCont);
            }
            rs.close();
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        }
        SQLServerDAOFactory.desconecta(con);
        return alClientes;
    }
    /**
    * Método que ejecuta las sentencias en la base de datos.
    * @param sentencia String que contiene la Sql que se tiene que ejecutar en la bd.
     * @return boolean
     * Devuelve un true en caso de que la sentencis haya ejecutado bien o false en caso de que mal
    **/
    public boolean ejecutarSentencia(String sentencia)
    {
        Connection con=null;
        Statement stmt=null;
        boolean correcto = false;
        try {
            con  = SQLServerDAOFactory.conecta();
            stmt = con.createStatement();
        } catch (SQLException ex) {
           
        }
        try {
            stmt.executeUpdate(sentencia);
            correcto = true;
            stmt.close();
        } catch (SQLException ex) {
            
        }
        SQLServerDAOFactory.desconecta(con);
        return correcto;
    }

    /**
    * Método que busca un cliente en la base de datos.
    * @param CliId String que contiene el id del cliente que se quiere buscar.
     * @return cliente Cliente es un objeto que contiene los datos de un cliente
    **/
    public Cliente buscarCliente(int CliId){
        Connection conexion = null;
        Cliente cliente=null;

        try {
            conexion = SQLServerDAOFactory.conecta();
            PreparedStatement ps = conexion.prepareStatement("SELECT CliId, CliNom, CliTlf1, CliTlf2, CliMail, CliWeb, CliDir, CliObserv FROM CLIENTE WHERE CliId = '"+CliId+"'");
            ResultSet rs = ps.executeQuery();
            cliente = crearCliente(rs);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
        return cliente;
    }
    /**
     * Crea una nueva instancia de un Cliente.
     * @param rs Contiene los datos del nuevo cliente.
     * @return Devuelve un objeto Cliente con los datos establecidos.
     */
    private Cliente crearCliente(ResultSet rs){
        Cliente cliente = new Cliente();
        try {
            if (rs.next()) {
                cliente.setCliId(rs.getInt("CliId"));
                cliente.setCliNom(rs.getString("CliNom"));
                cliente.setCliTlf1(rs.getString("CliTlf1"));
                cliente.setCliTlf2(rs.getString("CliTlf2"));
                cliente.setCliMail(rs.getString("CliMail"));
                cliente.setCliWeb(rs.getString("CliWeb"));
                cliente.setCliDir(rs.getString("CliDir"));
                cliente.setCliObserv(rs.getString("CliObserv"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cliente;
    }

    /*
     * Lista todos los clientes
     */
    //dbaykbp.bn
    public ArrayList<Cliente> listarClientes() throws GestorFormacionExcepcion {
        /*ArrayList<Cliente> clientes = new ArrayList<Cliente>();
        Cliente clienteaux;
        ResultSet rs = null;
        try {
            con = SQLServerDAOFactory.conecta();
            stmt = con.createStatement();
            rs = stmt.executeQuery("SELECT CliId,CliNom,CliTlf1,CliTlf2,CliMail,CliWeb,CliDir,CliObserv FROM cliente");
                while (rs.next()){
                clienteaux=new Cliente (rs.getInt("CliId"), rs.getString("CliNom"),
                                            rs.getString("CliTlf1"),rs.getString("CliTlf2"),
                                            rs.getString("CliMail"),rs.getString("CliWeb"),
                                            rs.getString("CliDir"),rs.getString("CliObserv"));
                if (clienteaux!=null){
                    clientes.add(clienteaux);
                }
            }
            rs.close();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerConvocatoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            SQLServerDAOFactory.desconecta(con);
            return clientes;
        }*/
        return getCliente(""); //Víctor: El código está repetido arriba con getCliente
    }    //dbaykbp.en

}
